/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.infrastructure.core.aspect.controller.children;

import cn.hallele.infrastructure.metadata.constant.MsgCodeConst;
import cn.hallele.infrastructure.metadata.exception.children.SensitiveException;
import cn.hallele.infrastructure.metadata.io.Response;
import cn.hallele.ms.infrastructure.core.aspect.controller.BaseExceptionAspect;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 敏感异常的处理，像数据库类、文件类等，避免异常信息暴露出去
 * 1、java.io.FileNotFoundException：泄露文件系统结构和文件名列举
 * 2、ava.util.jar.JarException：泄露文件系统结构
 * 3、java.util.MissingResourceException：资源列举
 * 4、java.security.acl.NotOwnerException：所有人列举
 * 5、java.util.ConcurrentModificationException ：可能提供线程不安全的代码信息
 * 6、javax.naming.InsufficientResourcesException：服务器资源不足，可能会造成dos攻击
 * 7、java.net.BindException：当不信任客户端能够选择服务器端口时造成开放端口列举
 * 8、java.lang.OutOfMemoryError：dos攻击
 * 9、java.lang.StackOverflowError：dos攻击
 * 10、java.sql.SQLException：数据库结构，用户名列举
 *
 * @author anle5
 * @since 2024/9/15 0:40
 */
@Slf4j
@RestControllerAdvice
@Order(10)
public class SensitiveExceptionAspect extends BaseExceptionAspect {
    /**
     * 拦截所有 {@link SensitiveException} 的报错, todo:错误码
     *
     * @param e SensitiveException
     * @return 错误响应
     */
    @ExceptionHandler(SensitiveException.class)
    public Response<?> encodeException(SensitiveException e) {
        String msgCode = e.getMessage();
        String msgDesc = i18n.getMessage(msgCode, new Object[]{}, MsgCodeConst.SENSITIVE_ERROR, getLocale());
        log.error("Find a SensitiveException. MsgCode: {}, msgDesc: {}.", msgCode, msgDesc, e);
        return buildResponse(msgCode, msgDesc);
    }

    /**
     * 国际化
     *
     * @param i18n 国际化
     */
    public SensitiveExceptionAspect(MessageSource i18n) {
        super(i18n);
    }
}
